home *** CD-ROM | disk | FTP | other *** search
/ Young Minds / Young Minds Interactive CD-ROM.ISO / qix / qix.h < prev    next >
Encoding:
C/C++ Source or Header  |  1988-01-28  |  5.6 KB  |  174 lines

  1. /*
  2.  * prototype joystick -- simple window with a joystick.
  3.  * click right mouse button to activate joystick.
  4.  * move mouse in direction to move drawing marker.
  5.  * click left mouse button to draw fast.
  6.  * click middle mouse button to draw slow.
  7.  * click right to stop moving.
  8.  * click right mouse twice (after stop moment) to return to normal state.
  9.  *
  10.  * The machine will not respond sometimes. I don't know why.
  11.  * I need suggestions on fixing this interface and making it
  12.  * more usable.
  13.  *
  14.  * compile -lsuntool -lsunwindow -lpixrect
  15.  */
  16. #include <stdio.h>
  17. #include <suntool/sunview.h>
  18. #include <suntool/canvas.h>
  19. #include <sys/time.h>
  20. #include <ctype.h>
  21.  
  22. #define when         break;case
  23. #define otherwise    break;default
  24. #define rrand        random
  25. #define SCOREFILE    "qix.scores"
  26.  
  27. Frame        frame;
  28. Canvas        Draw, Joystick;
  29. Pixwin        *draw_win, *joystick_win;
  30. Pixfont        *big_font, *small_font;
  31.  
  32. int
  33.     /* routines to call on sigalrm or sigwinch */
  34.     move_joystick(), move_pen(), redraw_board(),
  35.     score,         /* players score */
  36.     lives,        /* chances left before end of game */
  37.     nitems;        /* number of x/y coords in current line drawn */
  38.  
  39. #define MAX_LIVES    5  /* each game gives 5 lives */
  40. #define LIVE        1
  41. #define DIE           -1
  42.  
  43. #define SPARK_TIME    500
  44.  
  45. struct itimerval timeout;
  46.  
  47. #define start_timer()  \
  48.     timeout.it_value.tv_usec = 50000, setitimer(ITIMER_REAL, &timeout, NULL);
  49. #define stop_timer()  \
  50.     timerclear(&timeout.it_value), setitimer(ITIMER_REAL, &timeout, NULL);
  51.  
  52. #define LINE_SPACE            5 /* dist pen draws from other lines */
  53. #define MARKER_WIDTH            8
  54. #define TOP_BORDER            25
  55. #define BORDER                10 /* should be larger than MARKER_W */
  56.  
  57. #define BOARD_WIDTH_IN_PIXELS        700
  58. #define BOARD_HEIGHT_IN_PIXELS        750
  59. #define BOARD_WIDTH    ((BOARD_WIDTH_IN_PIXELS - 2 * BORDER)/LINE_SPACE)
  60. #define BOARD_HEIGHT    ((BOARD_HEIGHT_IN_PIXELS-BORDER-TOP_BORDER)/LINE_SPACE)
  61. #define TOTAL_AREA    ((BOARD_WIDTH-1) * (BOARD_HEIGHT-1))
  62. #define TOTAL_QUADRANTS    (TOTAL_AREA * 4)
  63.  
  64. #define MID_X            BOARD_WIDTH_IN_PIXELS / 2
  65. #define MID_Y            BOARD_HEIGHT_IN_PIXELS / 2
  66.  
  67. /* the board is a two dimentional array of ints. Values of ints are masked */
  68. int board[BOARD_WIDTH][BOARD_HEIGHT];
  69.  
  70. /*
  71.  * each "cell" ("_CL_") in the playing board may have values masked in.
  72.  * If a line is drawn thru a cell, it is entered from one direction and
  73.  * is exited to another direction.  It may be reentered thus setting the
  74.  * bits again.  When a region is "closed", it will be painted with a value
  75.  * "_PNT_" -- initially, the left border of the board will contain cells whose
  76.  * values will have left parts of the cells painted and right parts unpainted.
  77.  */
  78. #define CL_LN_RT           0x0001
  79. #define CL_LN_LF        0x0002
  80. #define CL_LN_UP          0x0004
  81. #define CL_LN_DN         0x0008
  82. #define CL_PNT_UL        0x0010
  83. #define CL_PNT_UR        0x0020
  84. #define CL_PNT_LR        0x0040
  85. #define CL_PNT_LL        0x0080
  86.  
  87. #define OLD_LINE        0x1000 /* line may be new, old, or neither */
  88. #define NEW_LINE        0x2000
  89.  
  90. #define CL_PNT_TOP        (CL_PNT_UL | CL_PNT_UR)
  91. #define CL_PNT_BOT        (CL_PNT_LL | CL_PNT_LR)
  92. #define CL_PNT_LEFT        (CL_PNT_UL | CL_PNT_LL)
  93. #define CL_PNT_RIGHT        (CL_PNT_UR | CL_PNT_LR)
  94. #define PAINTED            (CL_PNT_UL|CL_PNT_UR|CL_PNT_LL|CL_PNT_LR)
  95.  
  96. #define check_painted(x, y, paint) ((board[x][y] & paint) == paint)
  97.  
  98. #define SENS_FACTOR 3    /* mouse must move this many pixels to move joystick */
  99.  
  100. #define convert_x(coord) ((coord) * LINE_SPACE + BORDER)
  101. #define convert_y(coord) ((coord) * LINE_SPACE + TOP_BORDER)
  102. #define pen_coord_x(coord) (convert_x(coord) - MARKER_WIDTH)
  103. #define pen_coord_y(coord) (convert_y(coord) - MARKER_WIDTH)
  104.  
  105. extern Pixrect pen_image;
  106.  
  107. /* place_pen() macro XOR's the pen at its current coordinates */
  108. #define place_pen()   pw_rop(draw_win, \
  109.         pen_coord_x(pen_x), pen_coord_y(pen_y), \
  110.         16, 16, XOR, &pen_image, 0, 0)
  111.  
  112. #define XOR (PIX_SRC^PIX_DST)
  113. #define draw(x1,y1,x2,y2,OP)     pw_vector(draw_win, x1,y1,x2,y2,(OP),1)
  114. #define box(x1,y1,x2,y2,OP)     \
  115.     draw(x1,y1,x1,y2,OP), draw(x1,y2,x2,y2,OP), \
  116.     draw(x2,y2,x2,y1,OP), draw(x2,y1,x1,y1,OP)
  117.  
  118. #ifdef DEBUG
  119. /* "Bert" is the little man who follows points in debug mode */
  120. #define show_bert(x, y) \
  121.     if (debug > 2) \
  122.         box(convert_x(x)-3, convert_y(y)-3, \
  123.         convert_x(x)+3, convert_y(y)+3, XOR), \
  124.         usleep(30000), \
  125.         box(convert_x(x)-3, convert_y(y)-3, \
  126.         convert_x(x)+3, convert_y(y)+3, XOR)
  127. #endif NOT_NOW
  128.  
  129. #define l_width(font)    (font)->pf_defaultsize.x
  130. #define l_height(font)    (font)->pf_defaultsize.y
  131.  
  132. int
  133.     moving,        /* if moving (e.g. !NO_MOVE), which direction */
  134. #define NO_MOVE 0
  135. #define STOP    1
  136. #define LEFT    2
  137. #define RIGHT    3
  138. #define UP    4
  139. #define DOWN    5
  140. #define LEFT_OF(d)    (d==UP? LEFT : d==LEFT ? DOWN : d==DOWN ? RIGHT : UP)
  141. #define RIGHT_OF(d)    (d==UP? RIGHT : d==RIGHT ? DOWN : d==DOWN ? LEFT : UP)
  142. #define OPP_OF(d)    (d==UP? DOWN : d==RIGHT ? LEFT : d==DOWN ? UP : RIGHT)
  143.  
  144.     pen_x, pen_y,    /* the coordinates of the drawing pen */
  145.     fast,        /* when we're drawing, are we drawing "fast"? */
  146.     is_alive,        /* if the current play is active or not */
  147.     drawing,        /* boolean: the pen is/not down (drawing) */
  148.     level,        /* completing 75% of the board raises you one level */
  149.     Speed;        /* aggressiveness/speed of qix */
  150. #define MAX_SPEED    15  /* I don't think speed'll ever reach this */
  151.  
  152. struct region {
  153.     int x, y;
  154.     struct region *next, *prev;
  155. } *region, *cur_coord, *fuse;
  156.  
  157. int saved_edge;   /* Starting edge's original value of newly drawn lines */
  158. int area_closed;
  159. #ifdef DEBUG
  160. int debug, no_qix_kill;      /* debugging stuff */
  161. #endif DEBUG
  162.  
  163. int play_mode;
  164. #define REAL_PLAY    -1        /* must be last in list */
  165. #define SHOW_SCORES    0
  166. #define SHOW_POINTS    1
  167. #define SHOW_QIX    2
  168. #define SHOW_SPARKS    3
  169. #define SHOW_FUSE    4
  170. #define SHOW_SPIRAL    5
  171. #define DEMO        6
  172.  
  173. int time_left;
  174.